Angular依賴對象的創建方式有以下四種:
- useValue
 - useClass
 - useExisting
 - useFactory
 Nestjs也有Provider,先說說Provider作何用?
Provider就是用來建立Token與依賴對象的創建關係,然後DI系統會依據你使用的Token去創建依賴對象,如果我們需要用到很多依賴對象,又在沒有Provider情況下,就有可能是透過Factory去創建一堆依賴對象,然後寫了一堆方法,這蠻累的,這時有Provider就還蠻方便創建依賴對象,創建的事情就通通交給Provider,我們專注在程式邏輯即可。
npm install
useValue
2. 請修改ApplicationModule程式,程式碼如下:
src/modules/app.module.ts
import { Module } from '@nestjs/common';
import { UsersController } from './Users/users.controller';
import { UsersService } from './Users/Services/users.service';
//自定義Token名稱,這邊單純給定值就好。
const nameProvider = { provide: 'nameToken', useValue: 'Ted' };
@Module({
  modules: [],
  controllers: [UsersController],
  components: [UsersService, nameProvider],
})
export class ApplicationModule { }
//別忘記Component裝飾器
@Component()
export class UsersService {
...
    private name: string;
    //透過Token注入Name
    constructor( @Inject('nameToken') Name) { 
        this.name = Name;
    }
...
    //使用Promise,盡可能避免使用callback方式。
    getAllUsers() {
        this.users[0]._name = this.name;//'給予陣列0物件的_name特定值'
        return Promise.resolve(this.users);
    }
...
}
useClass
5. 在Services資料夾底下新增name.service.ts
src/modules/Users/Services/name.service.ts
import { Component } from '@nestjs/common';
//別忘記Component裝飾器
@Component()
export class NameService {
    newName(): string {
        return "Tommy";
    }
}
import { Module } from '@nestjs/common';
import { UsersController } from './Users/users.controller';
import { UsersService } from './Users/Services/users.service';
import { NameService } from './Users/Services/name.service';
//useValue 自定義Token名稱,這邊單純給定值就好。
const nameProvider = { provide: 'nameToken', useValue: 'Ted' };
//useClass 
const newNameProvider = {
  provide: NameService,
  useClass: NameService
}
@Module({
  modules: [],
  controllers: [UsersController],
  components: [UsersService, nameProvider, newNameProvider],
})
export class ApplicationModule { }
private name: string;
    private newName: string;
    //透過Token注入Name
    //透過class注入,DI會直接幫我們new 一個實例
    constructor( @Inject('nameToken') Name, @Inject('NameService') newNameService) {
        this.name = Name;        
        this.newName = newNameService.newName();
    }
    //假資料
    private users = [
        { "_id": 1, "_name": "Michael", "_age": 25 },
        { "_id": 2, "_name": "Mary", "_age": 27 }
    ];
    //使用Promise,盡可能避免使用callback方式。
    getAllUsers() {
        this.users[0]._name = this.name;//給予陣列0物件的_name特定值
        this.users[1]._name = this.newName;//給予陣列1物件的_name特定值
        return Promise.resolve(this.users);
    }
useFactory
9. 只修改ApplicationModule。
src/modules/app.modules.ts
import { Module } from '@nestjs/common';
import { UsersController } from './Users/users.controller';
import { UsersService } from './Users/Services/users.service';
import { NameService } from './Users/Services/name.service';
//useValue 自定義Token名稱,這邊單純給定值就好。
const nameProvider = { provide: 'nameToken', useValue: 'Ted' };
//useClass 
const newNameProvider = {
  provide: NameService,
  useClass: NameService
}
//useFactory
const newNameFactory = {
  provide: 'NameService',
  useFactory: () => {
    return new NameService();
  }
};
@Module({
  modules: [],
  controllers: [UsersController],
  components: [UsersService, nameProvider, newNameFactory]
})
export class ApplicationModule { }
注意看components並沒有newNameProvider,但程式仍正常運作,因為我們透過useFactory繼續提供NameService token。
程式碼都在github